package generic;

import java.lang.reflect.Array;
import java.util.Arrays;

import lombok.extern.slf4j.Slf4j;
/**
 * 类型的擦除
 */
@Slf4j
public class ArrayMaker <T>{
    //即使 kind 被存储为Class<T>，擦除也意味着它实际被存储为没有任何
    //参数的 Class。
    private Class<T> kind;

    public ArrayMaker(Class<T> kind) {
        this.kind = kind;
    }

    /**
     * Array.newInstance()实际上并未拥有kind所蕴含的类型信息。
     * 所以它不会产生具体的结果，因而必须转型
     * @param size
     * @return
     */
    @SuppressWarnings("unchecked")
    T[] create(int size) {
        return (T[])Array.newInstance(kind,size);//必须强转
    }

    public static void main(String[] args) {
        //创建专用字符串数组对象
        ArrayMaker<String> stringArrayMaker = new ArrayMaker<>(String.class);
        //创建10个长度的数组
        String[] strings = stringArrayMaker.create(10);
        strings[0]="1";
        strings[1]="222";
        log.info("字符串数组:{}",Arrays.toString(strings));
        log.info("字符串类型:{}",strings.getClass());
        
        ArrayMaker<Character> arrayMakerArrayMaker = new ArrayMaker<>(Character.class);
        Character[] arrayMakers = arrayMakerArrayMaker.create(2);
        log.info("字符数组:{}",Arrays.toString(arrayMakers));
        log.info("字符数组类型:{}",arrayMakers.getClass());
    }
}
